package com.emmmya.function;

import com.emmmya.annotation.ExpressionMethod;
import com.emmmya.harinCheck.utils.HarinStringUtils;

import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * POI-PLUGIN内置函数
 * @author harin
 * @version 1.0
 * @date 2022-05-07 10:49:33
 */
public class BuiltInFunction {

    //可以使用的内置函数名称 key 为函数的正则表达式,value为对应的方法
    public static Map<String, Method> METHOD_NAME_MAP = new HashMap<>();

    /**
     * 使用静态代码块，加载内置函数
     */
    static{
        Method[] methods = BuiltInFunction.class.getMethods();
        if(methods != null && methods.length>0){
            for (Method method : methods) {
                ExpressionMethod annotation = method.getAnnotation(ExpressionMethod.class);
                if(annotation != null){
                    METHOD_NAME_MAP.put(method.getName()+"\\((.+?)*\\)$",method);
                    String alias = annotation.alias();
                    if(HarinStringUtils.isNotEmpty(alias)){
                        METHOD_NAME_MAP.put(alias+"\\((.+?)*\\)$",method);
                    }
                }
            }
        }
    }

    /**
     * 在待操作前添加前缀，类似与 prefix + tager)
     * @param obj       原属性值
     * @param prefix    前缀
     * @return
     */
    @ExpressionMethod(alias = "prefix")
    public static Object addPrefix(Object obj,String prefix){
        if(HarinStringUtils.isEmpty(obj)){
            return obj;
        }
        return prefix + obj.toString();
    }

    /**
     * 在待操作前添加后缀
     * @param obj       原属性值
     * @param suffix    前缀
     * @return
     */
    @ExpressionMethod(alias = "suffix")
    public static Object addSuffix(Object obj,String suffix){
        if(HarinStringUtils.isEmpty(obj)){
            return obj;
        }
        return obj.toString() + suffix;
    }


    @ExpressionMethod(alias = "test")
    public static Object test(Object obj,String defaultValue,String hh){
        System.out.println(defaultValue);
        System.out.println(hh);
        return obj;
    }


    /**
     * 赋予默认值
     * @param obj
     * @param defaultValue
     * @return
     */
    @ExpressionMethod(alias = "default")
    public static Object defualt(Object obj,String defaultValue){
        return HarinStringUtils.isEmpty(obj)? defaultValue : obj;
    }


    /**
     * 格式化时间日期
     * @param date          时间日期类型
     * @param format        时间格式
     * @return
     */
    @ExpressionMethod(alias = "formatDate")
    public static String formatDate(Date date, String format){
        if(date == null) return "";
        if(HarinStringUtils.isEmpty(format)){ format = "yyyy-MM-dd HH:mm-ss" ;};
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        return simpleDateFormat.format(date);
    }

}
